package com.gobo.eduoss.service.impl;

import com.aliyun.oss.OSS;
import com.aliyun.oss.OSSClientBuilder;
import com.aliyun.oss.model.DeleteObjectsRequest;
import com.aliyun.oss.model.DeleteObjectsResult;
import com.gobo.eduoss.service.OssFileService;
import com.gobo.eduoss.utils.ConstantPropertiesUtil;
import com.gobo.servicebase.handler.exception.pojo.GoboException;
import org.joda.time.DateTime;
import org.springframework.stereotype.Service;
import org.springframework.util.StringUtils;
import org.springframework.web.multipart.MultipartFile;

import java.io.InputStream;
import java.io.UnsupportedEncodingException;
import java.net.URLDecoder;
import java.util.ArrayList;
import java.util.Iterator;
import java.util.List;
import java.util.UUID;

import static com.aliyuncs.auth.AcsURLEncoder.URL_ENCODING;

@Service
public class OssServiceImpl implements OssFileService {
    @Override
    public String uploadFile(MultipartFile multipartFile,String typaName) {

        return upload(multipartFile,typaName);
    }

    @Override
    public void removeFiles(List<String> fileNames) {

        // 删除文件。
        // 填写需要删除的多个文件完整路径。文件完整路径中不能包含Bucket名称。
        List<String> keys = new ArrayList<>();
        keys = fileNames;
        Iterator<String> stringIterator=keys.iterator();
        while(stringIterator.hasNext()){
            String s=stringIterator.next();
            ///default
            //判断是否是默认文件  默认文件不删除 包含首位不包含末尾
            if (s.substring(0,7).equals("default")){
                stringIterator.remove();
            }
        }
        System.out.println(keys);
        if (keys.size()<=0){
            return;
        }

        // yourEndpoint填写Bucket所在地域对应的Endpoint。以华东1（杭州）为例，Endpoint填写为https://oss-cn-hangzhou.aliyuncs.com。
        // 阿里云账号AccessKey拥有所有API的访问权限，风险很高。强烈建议您创建并使用RAM用户进行API访问或日常运维，请登录RAM控制台创建RAM用户。
        // 填写Bucket名称。
        String bucketName = ConstantPropertiesUtil.BUCKET_NAME;
        String endPonit = ConstantPropertiesUtil.END_PONIT;
        String keyId = ConstantPropertiesUtil.KEY_ID;
        String keySecret = ConstantPropertiesUtil.KEY_SECRET;

        // 创建OSSClient实例。
        OSS ossClient = new OSSClientBuilder().build(endPonit, keyId, keySecret);

        DeleteObjectsResult deleteObjectsResult = ossClient.deleteObjects(new DeleteObjectsRequest(bucketName).withKeys(keys).withEncodingType(URL_ENCODING));
        List<String> deletedObjects = deleteObjectsResult.getDeletedObjects();
        try {
            for(String obj : deletedObjects) {
                String deleteObj =  URLDecoder.decode(obj, "UTF-8");
                System.out.println(deleteObj);
            }
        } catch (UnsupportedEncodingException e) {
            e.printStackTrace();
        }
        // 关闭OSSClient。
        ossClient.shutdown();
    }

    @Override
    public void removeFile(String fileName) {
        if (StringUtils.isEmpty(fileName)){
            return;
        }

        fileName = fileName.substring(fileName.indexOf(".com")+5,fileName.length());
        // yourEndpoint填写Bucket所在地域对应的Endpoint。以华东1（杭州）为例，Endpoint填写为https://oss-cn-hangzhou.aliyuncs.com。
        String bucketName = ConstantPropertiesUtil.BUCKET_NAME;
        String endPonit = ConstantPropertiesUtil.END_PONIT;
        String keyId = ConstantPropertiesUtil.KEY_ID;
        String keySecret = ConstantPropertiesUtil.KEY_SECRET;

        // 填写文件完整路径。文件完整路径中不能包含Bucket名称。
        String objectName = fileName;

        // 创建OSSClient实例。
        OSS ossClient = new OSSClientBuilder().build(endPonit, keyId, keySecret);

        // 删除文件或目录。如果要删除目录，目录必须为空。
        ossClient.deleteObject(bucketName, objectName);

        // 关闭OSSClient。
        ossClient.shutdown();
    }

    private String upload(MultipartFile file,String typeName){
        String bucketName = ConstantPropertiesUtil.BUCKET_NAME;
        String endPonit = ConstantPropertiesUtil.END_PONIT;
        String keyId = ConstantPropertiesUtil.KEY_ID;
        String keySecret = ConstantPropertiesUtil.KEY_SECRET;
        try {
            // 创建OSSClient实例。
            OSS ossClient = new OSSClientBuilder().build(endPonit, keyId, keySecret);
            // 填写本地文件的完整路径。如果未指定本地路径，则默认从示例程序所属项目对应本地路径中上传文件流。
            InputStream inputStream = file.getInputStream();
            // 依次填写Bucket名称（例如examplebucket）和Object完整路径
            // （例如exampledir/exampleobject.txt）。
            // Object完整路径中不能包含Bucket名称。
            String uuid = UUID.randomUUID().toString().replaceAll("-", "");
            String fileName = uuid + file.getOriginalFilename();
            fileName = new DateTime().toString("yyyy/MM/dd") + "/"+typeName+"/" + fileName;
            ossClient.putObject(bucketName, fileName, inputStream);
            // 关闭OSSClient。
            ossClient.shutdown();
            //https://gobo-edu-online.oss-cn-qingdao.aliyuncs.com/%E5%BE%AE%E4%BF%A1%E5%9B%BE%E7%89%87_20210912105752.jpg
            String url = "https://" + bucketName + "." + endPonit + "/" + fileName;
            return url;
        } catch (Exception e) {
            e.printStackTrace();
            throw new GoboException(50002, "Oss上传讲师头像后端出错！");
        }
    }
}
